// 导入express
const express = require("express");
const app = express();

//大文件上传
const { resolve, extname } = require("path");
const { existsSync, appendFileSync, writeFileSync } = require("fs");

// 导入body-parser--处理表单解析
const bodyParser = require("body-parser");

// 导入cors -- 处理跨域
const cors = require("cors");

app.use(cors());

// Multer 是一个 node.js 中间件，用于处理 multipart/form-data 类型的表单数据，它主要用于上传文件。
const multer = require("multer");

// 在server服务端下新建一个public文件，在public文件下新建upload文件用于存放图片
const upload = multer({ dest: "./public/upload" });

app.use(upload.any());
// 静态托管
app.use(express.static("./public"));

// parse application/x-www-form-urlencoded
// 当extend为false时，只为数组或者字符串，当为true时，值可以为任意类型
app.use(bodyParser.urlencoded({ extended: false }));

// parse application/json
app.use(bodyParser.json());

app.use((req, res, next) => {
  res.cc = (err, status = 1) => {
    res.send({
      status,
      message: err instanceof Error ? err.message : err,
    });
  };
  next();
});

const jwtconfig = require("./jwt_config/index.js");
const { expressjwt: jwt } = require("express-jwt");

// 验证身份
app.use(
  jwt({
    secret: jwtconfig.jwtSecretKey,
    algorithms: ["HS256"],
  }).unless({
    path: [/^\/api\//],
  })
);
// 注册路由
const loginRouter = require("./router/login");
app.use("/api", loginRouter);

const userRouter = require("./router/userinfo");
app.use("/user", userRouter);

const settingRouter = require("./router/setting");
app.use("/set", settingRouter);

const fileRouter = require("./router/file");
app.use("/file", fileRouter);
// -------------------------------------------------前端技术测试
const testRouter = require("./router/test");
app.use("/test", testRouter);
// -------------------------------------------------前端技术解决方案

// 请求中断
const technologyRouter = require("./router/technology");
app.get("/video", technologyRouter.video_handle);
// chatgpt打字效果

// chatgpt 打字效果
app.get("/chat_typing", technologyRouter.chatgpt_effect);

// 获取十万条数据
app.get("/large-data", technologyRouter.Virtual_list);

// 大文件上传

app.post("/upload", (req, res) => {
  const { name, size, type, offset, hash } = req.body;
  const { file } = req.files;
  // console.log(name, size, type, offset, hash);
  //取后缀
  let ext = extname(name);
  let fileName = resolve(__dirname, "./upload/" + hash + ext);
  if (offset != 0) {
    if (!existsSync(fileName)) {
      res.status(400).send({
        msg: "文件不存在",
      });
      return;
    }
    appendFileSync(fileName, file.data);
    res.send({
      code: 200,
      data: "http://127.0.0.1:3007/" + fileName,
      msg: "文件写入成功",
    });
    return;
  }
  writeFileSync(fileName, file.data);
  res.send({
    code: 200,
    msg: "文件创建并写入成功",
  });
});

// 对不符合joi规则的情况进行报错
// 错误中间件
const joi = require("joi");
app.use(function (err, req, res, next) {
  // 数据验证失败
  if (err instanceof joi.ValidationError) {
    return res.cc(err);
  }
  // 捕获身份认证失败的错误
  if (err.name === "UnauthorizedError") {
    return res.cc('身份验证失败',401)
  }
  // 未知错误
  res.cc(err);
});

app.listen(3007, () => {
  console.log("http://127.0.0.1:3007");
});
